/*
 * 正则验证在regexps的key中
 * 对比验证下划线后面为被对比的ID：equalTo_#addOperPw1
 * ajax验证：
	 * 	ajax_url,传输方式get，数据：{value: inputVal}，后台需返回troe|false
 * 自定义方法验证：method_methodName
	 * 	如：传入被验证输入框的值，验证成功将bValidateObj.TorF赋值为true，反之赋值为false
	 	function methodName(_value){
			bValidateObj.TorF = false|true;
		}
 * 非空：required
 * 最长多少最短多少：range_8-16
 * 最长：maxlength_20
 * 最短：minlength_8
 * 文件支持多个或一个：file_jpg|png
 * 如：<input type="text" class="form-control " key="required,range_8-16,numberAndLetter"/>
 * 验证事件绑定和调用如下：
	 * 	失去焦点验证:
		 * 	输入框
			$('.bValidate[type!="flie').on('blur',function(){
				bValidateObj.bValidate($(this));
			});
		 * 	文件上传
			$('.bValidate[type="file"]').on('change',function(){
				bValidateObj.bValidate($(this));
			});
	 * 	表单提交前验证:
		 	bValidateObj.bValidateForm($('#formValidate'));
	 * 	验证调用：
			if(bValidateObj.bValidateCall($('#addServices_div'))){
				//验证成功执行代码
			}
 */
var bValidateObj= {
	TorF: false,
	inputsBox: null,
	regexps: [
		{key: 'number', msg: '请输入数字', value: /^[0-9]*$/},
		{key: 'letter', msg: '请输入字母', value: /^[A-Za-z]+$/},
		{key: 'numberAndLetter', msg: '请输入字母+数字', value: /^[A-Za-z][0-9]+$/},
		{key: 'numberOrLetter', msg: '请输入字母或数字', value: /^[A-Za-z0-9]+$/},
		{key: 'username', msg: '请输入字母数字下划线，5-16位，字母开头', value: /^[a-zA-Z][a-zA-Z0-9_]{4,15}$/},
		{key: 'chinese', msg: '请输入中文', value: /^[\u4e00-\u9fa5]*$/},
		{key: 'tel', msg: '请输入正确的座机或手机号码,长度为7-15', value: /^(\d{7,15})$/},
		{key: 'QQ', msg: '请输入正确的QQ号', value: /^[1-9][0-9]{4,}/},
		{key: 'postcode', msg: '请输入正确的邮政编码', value: /^[1-9]d{5}(?!d)/},
		{key: 'date', msg: '请输入正确的日期', value: /^((?:19|20)\d\d)-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/},
		{key: 'email', msg: '请输入正确的电子邮件', value: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/},
		{key: 'map', msg: '请输入正确的地图坐标', value: /^[-]?(\d|([1-9]\d)|(1[0-7]\d)|(180))(\.\d*),[-]?(\d|([1-8]\d)|(90))(\.\d*)+$/}
	],
	//去掉首尾空格
	trim: function(str){
		return str.replace(/(^\s*)|(\s*$)/g, "");
	},
	//将变量名变为事件
	method: function(methodName) {
		this.func = new Function(methodName);
	},
	//生成提示框
	initMsgBox: function(_that,_msg){
		$('.b-validate_msg').remove();
		_that.focus();
		_that.before('<div class="b-validate_msg">'+_msg+'</div>');
		var sto = setTimeout(function(){
			_that.prevAll('.b-validate_msg').remove();
			clearTimeout(sto);
		},2000);
	},
	bValidateCall: function(_inputsBox){
		inputsBox = _inputsBox;
		var inputs = _inputsBox.find('.bValidate');
		for(var i=0;i<inputs.length;i++){
			if(!bValidateObj.bValidate($(inputs[i]))){
				return false;
			}
		}
		return true;
	},
	bValidateForm: function(_form){
		_form.on('submit',function(){
			return bValidateObj.bValidateCall(_form);
		});
	},
	bValidate: function(_that){
		var key = _that.attr('key');
		var inputVal = bValidateObj.trim(_that.val());
		var testValue = function (_key){
			//复选框+单选框验证
			if((_that.is('input[type="checkbox"]') || _that.is('input[type="radio"]'))){
				//如果没有给单选框和复选框加非空条件则不验证直接返回true
				if(key != 'required'){
					return true;
				}
				var checkboxs = inputsBox.find('input[name="'+_that.attr('name')+'"]');
				for(var i=0;i<checkboxs.length;i++){
					if($(checkboxs[i]).is(':checked')){
						return true;
					}
				}
				bValidateObj.initMsgBox(_that,'请先选择，值不能为空');
				return false;
			}
			//当required不存在时并且输入框中没有内容和equalTo不存在时返回true
			if((key.indexOf('required') == -1) && (inputVal.length == 0) && (key.indexOf('equalTo') == -1)){
				return true;
			}
			if(_key.indexOf('_') != -1){
				var keys = _key.split('_');
				switch(keys[0]){
					case 'range': {
						var vals = keys[1].split('-');
						if(inputVal.length >= vals[0] && inputVal.length <= vals[1]){
							return true;
						}
						bValidateObj.initMsgBox(_that,'请输入介于'+vals[0]+'和'+vals[1]+'的字符');
						return false;
					}
					case 'maxlength': {
						if(inputVal.length <= keys[1]){
							return true;
						}
						bValidateObj.initMsgBox(_that,'请输入不超过'+keys[1]+'的字符');
						return false;
					}
					case 'minlength': {
						if(inputVal.length >= keys[1]){
							return true;
						}
						bValidateObj.initMsgBox(_that,'请输入不小于'+keys[1]+'的字符');
						return false;
					}
					case 'equalTo': {
						if(inputVal == $(keys[1]).val()){
							return true;
						}
						bValidateObj.initMsgBox(_that,'请再次输入');
						return false;
					}
					case 'method': {
						//执行方法
						var methodName = keys[1]+'("'+inputVal+'")';
						var c = new bValidateObj.method(methodName);
						c.func();
						if(bValidateObj.TorF){
							return true;
						}
						bValidateObj.initMsgBox(_that,'内容不符合，请重新输入');
						return false;
					}
					case 'ajax': {
						$.ajax({
							type:"get",
							url:keys[1],
							data:{value: inputVal},
							dataType: "json",
							success: function(TorF) {
								if(TorF){
									return true;
								}else{
									bValidateObj.initMsgBox(_that,'内容不符合，请重新输入');
									return false;
								}
							},
							error: function(){
								bValidateObj.initMsgBox(_that,'服务器错误');
								return false;
							}
						});
					}
					case 'file': {
						var fileType = null;
						var testFile = function(_name){
							if(fileType == _name){
								return true;
							}
							return false;
						}
						if(keys[1].indexOf('|') != -1){
							var vals = keys[1].split('|');
							for(var i=0; i<vals.length; i++){
								fileType = inputVal.substring(inputVal.length-vals[i].length,inputVal.length).toLowerCase();
								if(testFile(vals[i])){
									return true;
								}
							}
						}else{
							fileType = inputVal.substring(inputVal.length-keys[1].length,inputVal.length).toLowerCase();
							if(testFile(keys[1])){
								return true;
							}
						}
						_that.val(null);
						bValidateObj.initMsgBox(_that,'请选择：'+keys[1]+'类型的文件');
						return false;
					}
					default :{
						return true;
					}
				}
			}else{
				if(_key == 'required'){
					if(inputVal.length <= 0){
						bValidateObj.initMsgBox(_that,'内容不能为空');
						return false;
					}
					return true;
				}else{
					//正则表达式验证
					for(var i=0;i<bValidateObj.regexps.length;i++){
						if(_key == bValidateObj.regexps[i].key){
							//{key:'number',msg: '请输入数字', value: /^[0-9]*$/},
							if(bValidateObj.regexps[i].value.test(inputVal)){
								return true;
							}else{
								bValidateObj.initMsgBox(_that,bValidateObj.regexps[i].msg);
								return false;
							}
						}
					}
				}
			}
		}
		//如果,号不存在验证一次否则验证多次
		if(key.indexOf(',') == -1){
			return testValue(key);
		}else{
			var validates = key.split(',');
			for(var i=0;i<validates.length;i++){
				var boolean = testValue(validates[i]);
				if(boolean == false){
					return false;
				}
			}
			return true;
		}
	}
};
